\documentclass[12pt,a4paper]{article}

\usepackage{CJK}
\usepackage[margin=1.5cm, includefoot]{geometry}
\usepackage{indentfirst}

\begin{CJK}{UTF8}{fzst}
  \title{用ivman实现可移动设备的自动挂载}
  \author{陈如山\\chenrs@ics.neu.edu.cn}
  \date{2008年06月27日}
\end{CJK}

\begin{document}

\newlength{\parboxWidth}
\setlength{\parboxWidth}{13cm}
\newlength{\lineIndentWidth}
\setlength{\lineIndentWidth}{4ex}
\newlength{\vspaceForParbox}
\setlength{\vspaceForParbox}{2ex}

\begin{CJK}{UTF8}{fzst}
  \maketitle

  {\bf \large 注：本文所说方法对于使用 Gnome 和 KDE 桌面环境的用户并非必要，因为这两个桌面环境各自集成了自动挂载可移动设备的工具。}
  
  \section{概述}
  ivman 是一个 volume manager，通过配置 ivman ，可以实现如下功能：
  \begin{quote}\bf 当符合一定条件的设备插入系统时，ivman 调用执行相应的系统命令。\end{quote}
  
  利用这一特性，我们可以实现对可移动设备的自动挂载。
  
  \section{配置文件}
  ivman 的系统级配置文件存放在 /etc/ivman/ 目录下，用户级配置文件存放在 \$HOME/.ivman/ 下，对于普通用户，最好还是编辑用户级配置文件。
  
  ivman 的配置文件有多个，我们要用的主要是 IvmConfigActions.xml，从名字可以看出它其实是一个 xml 文件，语法如下：
  \begin{quote}
    \fbox{
      \parbox{\parboxWidth}{
        $<$ivm:Match name="matchname" value="matchvalue"$>$\\
        \hspace*{\lineIndentWidth}$<$ivm:Option name="optionname1" value="optionvalue1" /$>$\\
        \hspace*{\lineIndentWidth}$<$ivm:Option name="optionname2" value="optionvalue2" /$>$\\
        \hspace*{\lineIndentWidth}...\\
        $<$/ivm:Match$>$
      }
    }
  \end{quote}
  
  这里 $<$ivm:Match ... $>$ 就定义了我们概述中提到的"条件"，当我们插入的设备满足这个条件时，就进入这个 Match 块，而 $<$ivm:Option ... $>$ 就定义了要执行动作的类型和动作命令。

  \subsection{条件的定义}
  
  从上面的配置文件中可以看出，一个条件的定义是由一个 name 字段和一个 value 字段组成。这其实类似于C语言中的 if (matchname == matchvalue) \{ ... \}，matchname 表示变量名，matchvalue 表示变量的值。

  matchname 和 matchvalue 的取值来自于命令 {\em lshal} 的输出。下面简要介绍一下 lshal 。

  在了解 lshal 之前，得先对 HAL 这个概念有所了解，HAL 全称 Hardward Abstraction Layer，即硬件抽象层。从这个定义中不难看出，HAL 的作用是为上层用户程序提供底层硬件信息，这里的底层硬件信息是由一个叫 hald 的后台进程动态维护的，当你插入或拔出一个设备时，硬件信息就会发生相应的变化。lshal 的作用就是列出所有的这些硬件信息，它的输出格式如下所示：
  
  \begin{quote}
    \fbox{
      \parbox{\parboxWidth}{
        \vspace{\vspaceForParbox}
        ... ...\\
        udi = '/org/freedesktop/Hal/devices/volume\_uuid\_fa8fdeee\_5e75\_468c\\
        \hspace*{7ex}\_8b37\_70a8672f7676'\\
        \hspace*{2ex}block.device = '/dev/sdb1'  (string)\\
        \hspace*{2ex}block.is\_volume = true  (bool)\\
        \hspace*{2ex}block.major = 8  (0x8)  (int)\\
        \hspace*{2ex}block.minor = 17  (0x11)  (int)\\
        ... ... 
      }
    }
  \end{quote}

  其中，udi 表示 Unique Device Identifier，即唯一硬件标志符，每个设备都有一个不同于其他设备的 udi。其他行都是一些 key/value pair，用于描述该设备的一系列属性。

  \subsection{动作的定义}
  
\end{CJK}
\end{document}
